#ifndef _MATRIX4_H_
#define _MATRIX4_H_

#define MATRIZ_ROWS 4
#define MATRIZ_COLUMNS 4
#include "Vector.h"
#include <iostream>
using namespace std;

class Matrix4
{
    private:
        float elementos[MATRIZ_ROWS][MATRIZ_COLUMNS];

    public:
        Matrix4(); /*Inicializa como identidade */
        ~Matrix4(){}

        void imprimir(void);

        float get_rows(void) const{return(MATRIZ_ROWS);}
        float get_columns(void) const{return(MATRIZ_COLUMNS);}

        // Atribuir e ver valor de um elemento da matriz:
        float& operator()(unsigned int row, unsigned int column){return(elementos[row][column]);}
        const float& operator()(unsigned int row, unsigned int column) const{return(elementos[row][column]);}

        Matrix4 operator+(const Matrix4 & other) const;
        Matrix4 operator-(const Matrix4 & other) const;
        Matrix4 operator*(const Matrix4 & other) const;

        Vector3 operator*(const Vector3 & vector) const;
        Point3 operator*(const Point3 & point) const;

        /* Multiplica a matriz atual do OpenGL com a matriz atual usando glMultMatrix() */
        void applyGL() const;
};

Matrix4 translationMatrix(Vector3 displacement); /* Matriz de translação com veto displacement */
Matrix4 scaleMatrix(float x, float y, float z); /* Matriz de escala */
Matrix4 rotationMatrix(float angle, Vector3 axis); /* Matrix de rotação geral por ângulo angle e eixo de rotação axis */
Matrix4 shearMatrix(float angle);
float rad(float angulo);

#endif
